home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / scope / 076-100 / scopedisk83 / beep103 / beep103.asm < prev    next >
Assembly Source File  |  1995-03-19  |  5KB  |  225 lines

  1. ******************************************************************
  2. *                                 *
  3. *    Beep. By David Jenkins                     *
  4. *                                 *
  5. ******************************************************************
  6.  
  7.      nolist
  8.           include  "exec/types.i"
  9.           include  "exec/io.i"
  10.           include  "exec/libraries.i"
  11.           include  "exec/memory.i"
  12.           include  "exec/execbase.i"
  13.           include  "offsets/rom.ofs"
  14.       include  "devices/audio.i"    
  15.     list
  16.  
  17. sysbase    equ    4
  18. * Get space for variables
  19.     bra    start
  20.     dc.b    'Beep 1.03'
  21.     dc.b    '25/Jan/89'
  22. start
  23.     moveq    #5,d6
  24.     moveq    #5,d5
  25.     cmpi.b    #10,(a0)    any data
  26.     beq    noparm        no    
  27.     move.b    (a0),d6        pitch
  28.     cmpi.b    #10,1(a0)    any data
  29.     beq    noparm        no
  30.     move.b    2(a0),d5    duration
  31.  
  32. noparm
  33.     movea.l    4,a6            exec base
  34.     move.l  #lengthvar,d0        size of structure
  35.     move.l  #MEMF_CLEAR+MEMF_PUBLIC,d1 memory type = CLEAR and PUBLIC
  36.     jsr     AllocMem(a6)    call AllocMem
  37.     move.l    d0,a5        keep it
  38.     bne    ok1
  39.     moveq    #8,d0
  40.     rts
  41.  
  42. ** get port space for audio device
  43. ok1
  44.     movea.l    4,a6            exec base
  45.     moveq   #MP_SIZE,d0        size of structure
  46.     move.l  #MEMF_CLEAR+MEMF_PUBLIC,d1 memory type = CLEAR and PUBLIC
  47.     jsr     AllocMem(a6)    call AllocMem
  48.  
  49.     move.l  d0,audioport(a5)    save  Port
  50.     bne    gotsp
  51.     moveq    #8,d0
  52.     rts            Big trouble. give up
  53.  
  54.  
  55. ** fill in audio port fields 
  56.  
  57. gotsp    movea.l    audioport(a5),a1
  58.     move.b  #NT_MESSAGE,LN_TYPE(a1) LN_TYPE = NT_MESSAGE(5)
  59.     move.l    #audioportname,LN_NAME(a1)    name
  60.  
  61. * allocate a signal bit
  62.  
  63.         move.l  sysbase,a6      Exec Lib Ptr
  64.     moveq.l    #-1,d0            any signal will do
  65.     jsr    AllocSignal(a6)
  66.     moveq.l    #0,d1            convert signum to a mask
  67.     bset.l    d0,d1
  68.     move.l    d1,d7            stash  sig bit
  69.  
  70.     movea.l    audioport(a5),a1
  71.     move.b    d0,MP_SIGBIT(a1)    save signal bit
  72.  
  73. * Find what task we are in, and install it in the msg ports
  74.  
  75.     sub.l   a1,a1           my task
  76.         jsr     FindTask(a6)
  77.     movea.l    audioport(a5),a1
  78.     move.l    d0,MP_SIGTASK(a1)    task pointer
  79.  
  80.  
  81. ** add  ports
  82.  
  83.         move.l   audioport(a5),a1     Message Port
  84.         jsr      AddPort(a6)   Add another Port to list
  85.  
  86. ** Set up audio IOReq structures
  87.     
  88.  
  89.     lea    audioreq(a5),a1    audio IORequest
  90.     move.b  #NT_MESSAGE,LN_TYPE(a1) LN_TYPE = NT_MESSAGE(5)
  91.     move.b  #0,LN_PRI(a1)     LN_PRI = 0
  92.     move.l  audioport(a5),MN_REPLYPORT(a1) move in message port pointer
  93.  
  94.  
  95. ** open audio device 
  96.  
  97.  
  98. * allocate a channel
  99.  
  100.     lea    audioreq(a5),a1        IOReq
  101.     move.b    #90,LN_PRI(a1)        set priority
  102.     move.l    #channel,ioa_Data(a1)     ask for channel
  103.     move.l    #4,ioa_Length(a1)    set length to do allocate
  104.     move.w    #ADCMD_ALLOCATE,IO_COMMAND(a1) get channel
  105.  
  106.     lea    audioname,a0        audio device name
  107.     moveq    #0,d0            unit number        
  108.     lea    audioreq(a5),a1        IOReq
  109.     moveq    #0,d1            flags
  110.     jsr    OpenDevice(a6)    
  111.     lea    audioreq(a5),a1        IOReq
  112.     cmpi.b    #0,IO_ERROR(a1)        ok?
  113.     beq.s    beepset            yes
  114.     moveq    #0,d0
  115.     move.b    IO_ERROR(a1),d0
  116.     rts
  117.  
  118. * set up for beep
  119.  
  120. beepset    move.l  #2,d0        size of buffer
  121.     move.l  #MEMF_CLEAR+MEMF_CHIP,d1 chip memory 
  122.     JSR     AllocMem(a6)    call AllocMem
  123.     tst.l    d0        got memory?
  124.     beq    nomem        no
  125.     movea.l    d0,a4        keep memory address
  126.     move.w    #$7f81,0(a4)    nice square wave
  127.  
  128. redo    lea    audioreq(a5),a1        IOaudio
  129.     move.b    #ADIOF_PERVOL,IO_FLAGS(a1) new period and volume
  130.     move.l    a4,ioa_Data(a1)        data
  131.     move.l    #2,ioa_Length(a1)    length
  132.     moveq    #0,d0
  133.     moveq    #0,d1
  134.     move.b    d6,d0
  135.     and.b    #$f,d0
  136.     bne.s    1$
  137.     move.b    #5,d0
  138. 1$    move.b    d0,d1    
  139.     mulu    #1000,d0
  140.     move.w    d0,ioa_Period(a1)    set period
  141.     moveq    #0,d0
  142.     move.b    d5,d0
  143.     and.b    #$f,d0
  144.     bne.s    2$
  145.     move.b    #5,d0
  146. 2$    mulu    #100,d0
  147.     divu    d1,d0            calculate cycles
  148.     move.w    #64,ioa_Volume(a1)    loud
  149.     move.w    d0,ioa_Cycles(a1)    how long
  150.     move.w    #CMD_WRITE,IO_COMMAND(a1) write
  151.     BEGINIO
  152.     
  153.  
  154.     move.l    d7,d0            wait for signal
  155.     jsr    Wait(a6)        call wait
  156.  
  157. getnext    move.l    audioport(a5),a0    get message form audio port
  158.     movea.l    4,a6        set Exec base
  159.     jsr     GetMsg(A6)    call GetMsg
  160.     tst.l    d0        any more?
  161.     bne.s    getnext        yes
  162.  
  163.     lea    audioreq(a5),a1
  164.     move.b    #0,IO_FLAGS(a1)
  165.     move.w    #ADCMD_WAITCYCLE,IO_COMMAND(a1) wait for end
  166.     BEGINIO
  167.  
  168.     move.l    d7,d0            wait for signal
  169.     jsr    Wait(a6)        call wait
  170.  
  171.  
  172. getnext2 move.l    audioport(a5),a0    get message form audio port
  173.     movea.l    4,a6        set Exec base
  174.     jsr     GetMsg(A6)    call GetMsg
  175.     tst.l    d0        any more?
  176.     bne.s    getnext2    yes
  177.  
  178.     lea    audioreq(a5),a1
  179.     move.b    IO_ERROR(a1),ret(a5)
  180.  
  181.     moveq    #0,d0
  182.     move.b    MP_SIGBIT+audioreq(a5),d0
  183.     JSR     FreeSignal(A6)        FreeSignal
  184.  
  185.     movea.l a4,a1    audio data
  186.     moveq   #2,D0    size of structure
  187.     jsr     FreeMem(A6)    call FreeMem
  188.  
  189.  
  190. nomem    lea    audioreq(a5),a1    audio IORequest
  191.     JSR     CloseDevice(a6)    call CloseDevice
  192.  
  193. bye     movea.l  audioport(a5),a1      Remove the timer Port
  194.         jsr      RemPort(a6)
  195.  
  196.     movea.l audioport(a5),a1    audio port
  197.     moveq   #MP_SIZE,D0    size of structure
  198.     jsr     FreeMem(A6)    call FreeMem
  199.  
  200.     moveq    #0,d0
  201.     move.b    ret(a5),d2
  202.     move.l    a5,a1
  203.     move.l  #lengthvar,D0    size of structure
  204.     jsr     FreeMem(A6)    call FreeMem
  205.     move.l    d2,d0
  206.     rts
  207.  
  208.     cnop    0,4
  209. channel    dc.l    $01020408
  210.  
  211.     cnop    0,4
  212. audioname dc.b    'audio.device',0
  213.  
  214.     cnop    0,4
  215. audioportname dc.b 'Audiodj',0
  216.         
  217.         offset 0
  218. startvar
  219. audioreq    ds.b    ioa_SIZEOF
  220. audioport    ds.l    1        port address
  221. ret        ds.b    1
  222. lengthvar    equ    *-startvar
  223.         end
  224.